package com.winner.data.util;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.expression.ExpressionUtil;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

/**
 * 将变量带入公式计算值 , 返回结果是 数字 , 如果是 1>2, 可以返回结果强转为bool类型
 * https://blog.csdn.net/Flying_Fish_roe/article/details/137172292
 *
 * @author wangxinle5
 * @since 2024-04-10
 */
public class ExpressionCalculateUtils {

    public static void main(String[] args) {
        //  为了使用hutool的ExpressionUtil计算数学表达式(优先用 字符串拼接好 要结算的表达式), 需要引入mvel2依赖
        String ruleExpress = "1 + 2 * (3 - 1) + score";
        Map<String, Object> map = new HashMap<>();
        map.put("score", 90);
        // 将变量带入公式进行计算, 如果就是一个表达式, 没有变量,map传null即可
        Object eval = ExpressionUtil.eval(ruleExpress, map);
        System.out.println(eval);

        BigDecimal b1 = new BigDecimal(String.valueOf(eval));
        BigDecimal result = b1.setScale(2, RoundingMode.HALF_UP);
        System.out.println(result);

        // 加法
        double add = NumberUtil.add(1, 2);
        // 减法
        double sub = NumberUtil.sub(1, 1);

        // 乘法 四舍五入
        BigDecimal round = NumberUtil.round(NumberUtil.mul(1, 0.123456), 4, RoundingMode.HALF_UP);
        // 针对数字类型做除法，并提供重载方法用于规定除不尽的情况下保留小数位数和舍弃方式。
        System.out.println(StrUtil.format("小数位数四舍五入模式, 结果是 {}", round));

        // roundStr最终返回String
        String div = NumberUtil.roundStr(NumberUtil.div(4, 6), 4, RoundingMode.DOWN);
        System.out.println(StrUtil.format("小数位数全部舍弃模式, 结果是 {}", div));

        boolean integer = NumberUtil.isInteger("-1");
        System.out.println(integer);
    }
}
